package com.lncg.service;

import com.lncg.entity.DeviceSendData;
import com.lncg.entity.DeviceReceiveData;

import java.util.List;

/**
 * 设备下发数据服务接口
 * 
 * 支持四种协议格式：
 * 1. 32字节确认指令（服务端下发确认消息）
 * 2. 70字节下发数据指令（服务端下发数据消息）
 * 3. 32字节上行确认指令（表端回复确认消息）
 * 4. 92字节上行数据指令（表端上报数据）
 */
public interface DeviceSendDataService {

    /**
     * 处理设备数据接收后的下发逻辑
     * 1. 根据IMEI查询是否有待下发的数据
     * 2. 如果没有，则生成32字节确认指令并发送
     * 3. 如果有，则生成70字节下发数据指令并发送
     * 
     * @param deviceData 接收到的设备数据
     * @param clientIp 客户端IP
     * @param clientPort 客户端端口
     * @return 是否处理成功
     */
    boolean processAfterReceive(DeviceReceiveData deviceData, String clientIp, int clientPort);

    /**
     * 根据IMEI查询待下发的数据
     * @param imei 设备IMEI
     * @return 待下发的数据，如果没有则返回null
     */
    DeviceSendData findPendingData(String imei);

    /**
     * 生成32字节确认指令
     * 协议格式：前导符(2) + 指令编号(10) + 指令类型(1) + IMEI(16) + CRC16(2) + 结束符(1)
     * 
     * @param instructionId 指令编号
     * @param imei 设备IMEI
     * @return 32字节确认指令
     */
    byte[] generateConfirmCommand(String instructionId, String imei);

    /**
     * 生成70字节下发数据指令
     * 协议格式：前导符(2) + 指令编号(10) + 指令类型(1) + IMEI(16) + 表号(12) + 厂商标识(2) + 
     *          IP地址及端口(10) + 正累计数据(4) + 负累计数据(4) + 上线间隔(1) + 重发次数(1) + CRC16(2) + 结束符(1)
     * 
     * @param instructionId 指令编号
     * @param imei 设备IMEI
     * @param sendData 下发数据
     * @return 70字节下发数据指令
     */
    byte[] generateDataCommand(String instructionId, String imei, DeviceSendData sendData);

    /**
     * 解析32字节上行确认指令
     * 协议格式：前导符(2) + 指令编号(10) + 指令类型(1) + IMEI(16) + CRC16(2) + 结束符(1)
     * 
     * @param data 32字节数据
     * @return 解析结果，包含指令编号和IMEI
     */
    ConfirmResponse parseConfirmResponse(byte[] data);

    /**
     * 发送确认指令给TCP客户端
     * @param clientIp 客户端IP
     * @param clientPort 客户端端口
     * @param command 确认指令
     * @return 是否发送成功
     */
    boolean sendConfirmCommand(String clientIp, int clientPort, byte[] command);

    /**
     * 发送下发数据指令给TCP客户端
     * @param clientIp 客户端IP
     * @param clientPort 客户端端口
     * @param command 下发数据指令
     * @return 是否发送成功
     */
    boolean sendDataCommand(String clientIp, int clientPort, byte[] command);

    /**
     * 根据指令编号更新发送状态
     * @param instructionId 指令编号
     * @param status 发送状态（0=待发送，1=已发送）
     * @return 是否更新成功
     */
    boolean updateSendStatusByInstructionId(String instructionId, int status);

    /**
     * 确认响应结果
     */
    class ConfirmResponse {
        private String instructionId;
        private String imei;
        private boolean valid;

        public ConfirmResponse(String instructionId, String imei, boolean valid) {
            this.instructionId = instructionId;
            this.imei = imei;
            this.valid = valid;
        }

        public String getInstructionId() { return instructionId; }
        public String getImei() { return imei; }
        public boolean isValid() { return valid; }
    }
}
